package com.bi.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.bi.entity.ComponentCategory;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 组件分类Mapper接口
 * 
 * @author BI Platform Team
 * @since 1.0.0
 */
@Mapper
public interface ComponentCategoryMapper extends BaseMapper<ComponentCategory> {

    /**
     * 查询根分类列表
     * 
     * @param componentType 组件类型
     * @return 根分类列表
     */
    List<ComponentCategory> selectRootCategories(@Param("componentType") String componentType);

    /**
     * 查询子分类列表
     * 
     * @param parentId 父分类ID
     * @return 子分类列表
     */
    List<ComponentCategory> selectChildrenCategories(@Param("parentId") Long parentId);

    /**
     * 查询完整分类树
     * 
     * @param componentType 组件类型
     * @return 分类树
     */
    List<ComponentCategory> selectCategoryTree(@Param("componentType") String componentType);

    /**
     * 查询分类路径
     * 
     * @param categoryId 分类ID
     * @return 分类路径
     */
    List<ComponentCategory> selectCategoryPath(@Param("categoryId") Long categoryId);

    /**
     * 更新分类路径
     * 
     * @param categoryId 分类ID
     * @param path 新路径
     * @return 更新结果
     */
    int updateCategoryPath(@Param("categoryId") Long categoryId, @Param("path") String path);

    /**
     * 检查分类名称是否存在
     * 
     * @param name 分类名称
     * @param parentId 父分类ID
     * @param excludeId 排除的分类ID
     * @return 是否存在
     */
    boolean existsCategoryName(@Param("name") String name, 
                              @Param("parentId") Long parentId,
                              @Param("excludeId") Long excludeId);

    /**
     * 查询分类下的组件数量
     * 
     * @param categoryId 分类ID
     * @return 组件数量
     */
    int countComponentsByCategory(@Param("categoryId") Long categoryId);

    /**
     * 批量更新分类路径
     * 
     * @param oldPath 旧路径前缀
     * @param newPath 新路径前缀
     * @return 更新数量
     */
    int batchUpdateCategoryPath(@Param("oldPath") String oldPath, @Param("newPath") String newPath);
}